package com.wiiss.common.utils.uuid;

import de.huxhorn.sulky.ulid.ULID;

/**
 * ID生成器工具类
 *
 * @author my
 */
public class IdUtils {
    private final static ULID ulid = new ULID();

    /**
     * 获取随机UUID
     *
     * @return 随机UUID
     */
    public static String randomUUID() {
        return UUID.randomUUID().toString();
    }

    /**
     * 简化的UUID，去掉了横线
     *
     * @return 简化的UUID，去掉了横线 ae626b148e074f868dfda06828af9752
     */
    public static String simpleUUID() {
        return UUID.randomUUID().toString(true);
    }

    /**
     * 获取随机UUID，使用性能更好的ThreadLocalRandom生成UUID
     *
     * @return 随机UUID 8c5e7eeb-3c6b-4cd5-b186-cce492d075e9
     */
    public static String fastUUID() {
        return UUID.fastUUID().toString();
    }

    /**
     * 简化的UUID，去掉了横线，使用性能更好的ThreadLocalRandom生成UUID
     *
     * @return 简化的UUID，去掉了横线 95378ac6f899412e8b3fab8e17eb6280
     */
    public static String fastSimpleUUID() {
        return UUID.fastUUID().toString(true);
    }


    /**
     * 随机生成字符，只有数字
     *
     * @param length id长度
     */
    public static Long numberID(Integer length) {
        String uid = "";
        for (int i = 0; i < length; i++) {
            String randChar = String.valueOf(Math.round(Math.random() * 9));
            uid = uid.concat(randChar);
        }
        return Long.parseLong(uid);
    }

    /**
     * 生成ULID
     *
     * <p>
     * 1. 替换数据库自增id，无需DB参与主键生成
     * <p>
     * 2. 分布式环境下，替换UUID，全局唯一且毫秒精度有序
     * <p>
     * 3. 比如要按日期对数据库进行分区分表，可以使用ULID中嵌入的时间戳来选择正确的分区分表
     * <p>
     * 4. 如果毫秒精度是可以接受的（毫秒内无序），可以按照ULID排序，而不是单独的created_at字段
     */
    public static String simpleULID() {
        return ulid.nextULID();
    }

}
